#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>

int main(int argc, char const *argv[])
{
    //printf( "printf without \\n " );   // 情况 1)
    printf( "begin with \\n \n" );       // 情况 2)
    
    pid_t pid = fork();
    if ( pid == -1 )
    {
        perror( "fail fork " );
        return -1;
    }
    if ( pid > 0 )
    {
        printf( "Parent proccess\n" );
    }
    else if ( pid == 0 )
    {
        printf( "Child proccess\n" );
    }
    return 0;
}

/*
程序功能
    测试 stdout 缓存
    测试 父进程/子进程 的执行过程

涉及函数
    printf
    fork

知识要点
    在程序开始时, printf, 
        1) 如果带 \n , 只打印一遍
        2) 如果不带 \n , 则打印 两遍
    因为 stdout 的缓存 问题, 只有三种情况会刷新缓存: \n, fflush, 缓存区满.
    当情况 1) 时, printf 将字符串输出到缓存, 却没有输出, 子进程被创建之后, 也把这个缓存拷贝过去.
    当父进程和子进程再次输出 \n 时, 会把缓存一起刷新, 所以最终输出打印两次 
    当情况 2) 时, 缓存已经刷新, 缓冲区没有内容, 所以只有父进程输出打印一次  
    

*/